//
//  SXStatusPictureView.swift
//  微博09项目
//
//  Created by mac on 15/9/10.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit
import SDWebImage
//选中图片的通知
let SXStatusPictureViewSelectedPhotoNotification = "SXStatusPictureViewSelectedPhotoNotification"
/// 选中索引 Key
let SXStatusPictureViewSelectedPhotoIndexPathKey = "SXStatusPictureViewSelectedPhotoIndexPathKey"
/// 选中的图片 URL Key
let SXStatusPictureViewSelectedPhotoURLsKey = "SXStatusPictureViewSelectedPhotoURLsKey"

private let SXStatusPictureViewCellID = "SXStatusPictureViewCellID"
class SXStatusPictureView: UICollectionView {
    var statusViewModel:SXStatusViewModel?{
        didSet{
            sizeToFit()
            //一定要记得刷新数据源
            reloadData()
        }
    }
    
    //    override init(frame: CGRect) {
    //        super.init(frame: frame)
    //        contentView.addSubview(iconView)
    //        iconView.ff_Fill(self)
    //    }
    //默认的layout没有被初始化
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: UICollectionViewFlowLayout())
        
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        layout.minimumInteritemSpacing = SXStatusPictureItemMargin
        layout.minimumLineSpacing = SXStatusPictureItemMargin
        // backgroundColor = UIColor.lightGrayColor()
        backgroundColor = UIColor(white: 0.9, alpha: 1.0)
        //指定数据源，自己做自己的数据源
        dataSource = self
        
        delegate = self
        //注册可重用cell
        registerClass(SXStatusPictureViewCell.self, forCellWithReuseIdentifier:SXStatusPictureViewCellID)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    //系统自带的 方法，这个方法需要返回一个CGSize 这个值就是collectionView的值
    override func sizeThatFits(size: CGSize) -> CGSize {
        return calcViewSize()
    }
    private func calcViewSize() ->CGSize{
        //1，准备工作
        let layout = collectionViewLayout as! UICollectionViewFlowLayout
        //2,设置默认的大小
        layout.itemSize = CGSize(width:SXStatusPictureItemWidth , height: SXStatusPictureItemWidth)
        //3，根据图片数量来计算大小
        let count = statusViewModel?.thumbnailURLs?.count ?? 0
        //当图片数量为0时
        if count == 0{
            return CGSizeZero
        }
        if count == 1{
            //临时取得一个大小
            var size = CGSize(width: 150, height: 150)
            //判断图片石头已经被正确的缓存，Key 是URL的完整字符串
            let key = statusViewModel!.thumbnailURLs![0].absoluteString
            if let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key) {
              size = image.size
            }
            size.width = (size.width < 40 ? 40 : size.width)
            size.width = (size.width > 300 ? 300 : size.width)
            
            layout.itemSize = size
            return size
        }
        if count == 4{
            let width  = SXStatusPictureItemWidth * 2 + SXStatusPictureItemMargin
            return CGSize(width: width, height: width)
        }
        let row = CGFloat((count - 1)/Int(SXStatusPictureMaxCount) + 1)
        let height = (SXStatusPictureItemWidth + SXStatusPictureItemMargin) * row
        let width = SXStatusPictureMaxWidth
        
        return CGSize(width: width, height: height)
    }
  }
 /// 数据源
extension SXStatusPictureView: UICollectionViewDataSource,UICollectionViewDelegate{
    ///UICollectionViewDelegate代理方法
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
//        let v = UIView(frame: screenRect(indexPath))
//        v.backgroundColor = UIColor.redColor()
        //这个一定要添加在window上才能显示,因为这儿不能加到iconView上
//        UIApplication.sharedApplication().keyWindow?.addSubview(v)
//        print(indexPath)
//        print(statusViewModel?.bmiddleURLs)
       // 发送通知
        /**
        object: 发送的对象，可以传递一个数值，也可以是`自己`，通过 obj.属性
        userInfo: 可选字典，可以传递多个数值，object 必须有值
        */
        NSNotificationCenter.defaultCenter().postNotificationName(SXStatusPictureViewSelectedPhotoNotification, object: self, userInfo: [SXStatusPictureViewSelectedPhotoIndexPathKey: indexPath,SXStatusPictureViewSelectedPhotoURLsKey:statusViewModel!.bmiddleURLs!])
    }
    ///返回指定indexPath 对应的 cell 在屏幕上的坐标位置
    func screenRect(indexPath:NSIndexPath) -> CGRect {
        let cell = cellForItemAtIndexPath(indexPath)
        
        // 转换坐标 convert，每一个视图的 frame 都是相对父视图来定义的
        // 有的时候，同一个位置，需要知道在其他视图中的对应位置，这个时候，就可以使用 conver 函数
        // UIView 本身就遵守了 UICoordinateSpace 协议，该协议提供了坐标转换的方法
        return convertRect(cell!.frame, toCoordinateSpace: UIApplication.sharedApplication().keyWindow!)
    }
    func fullScreenRect(indexPath:NSIndexPath) ->CGRect{
        //根据[缩略图]‘图片’ 来计算目标尺寸
        //1，拿到缩略图
        let key = statusViewModel!.thumbnailURLs![indexPath.item].absoluteString
        let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(key)
        //2.根据图像计算宽高比
        let scale = image.size.height / image.size.width
        let w = UIScreen.mainScreen().bounds.width
        let h = w * scale
        
        //3,判断高度
        var y = (UIScreen.mainScreen().bounds.height - h) * 0.5
        if y < 0{// 如果图片的高度大于屏幕高度，让图片置顶
            y = 0
        }
        return CGRect(x: 0, y: y, width: w, height: h)
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        //这里一定要注意，在做缓存设置行高的时候一定要设置预估行高，如果将预估行高和真实的行高设置同时执行，不能写成 (statusViewModel?.thumbnailURLs?.count)! ，这样回报一个野指针错误，应该写成下面的这种方法
        /// warning 这里为什么如果是强行解包就要报错（野指针）
        return statusViewModel?.thumbnailURLs?.count ?? 0
    }
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(SXStatusPictureViewCellID, forIndexPath: indexPath) as! SXStatusPictureViewCell
        cell.imageURL = statusViewModel?.thumbnailURLs![indexPath.item]
       // print(cell.imageURL)
        return cell
    }
    
}

private class SXStatusPictureViewCell:UICollectionViewCell{
    //配图的URL
    var imageURL: NSURL?{
        didSet{
            iconView.sd_setImageWithURL(imageURL)
            
            //在设置图像 URL 的同时，根据图片的扩展名 来判断是否是GIF
            gifIconView.hidden = (imageURL!.absoluteString as NSString).pathExtension.lowercaseString != "gif"
        }
    }
    
    // MARK: - 构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        addSubview(iconView)
        iconView.addSubview(gifIconView)
        
        iconView.ff_Fill(self)
        
        gifIconView.ff_AlignInner(type: ff_AlignType.BottomRight, referView: iconView, size: nil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    //懒加载图片
  //  private var iconView:UIImageView = UIImageView()
    private lazy var iconView :UIImageView = {
        let imageView = UIImageView()
        //设置填充颜色模式
        imageView.contentMode = UIViewContentMode.ScaleAspectFill
        //设置是否可以裁剪
        imageView.clipsToBounds = true
        
        //返回imageView
        return imageView
    }()
    
    private lazy var gifIconView: UIImageView = UIImageView(image: UIImage(named: "timeline_image_gif"))
}



